package main

import (
	"fmt"
	"time"
)

func producer(out chan<- int) {
	for i := 0; i < 10; i++ {
		out <- i
		//data := <-out //写通道不允许有读取操作
		fmt.Println("====>向管道中写入数据:", i)
	}

	//close(out) //写完关闭
}

func consumer(in <-chan int) {
	//in <- 10 //读通道不允许有写入操作
	for v := range in {
		fmt.Println("从管道读取数据: ", v)
	}
}
func main() {
	// **单向读通道**  var numChanReadOnly <-chan int
	// **单向写通道**  var numChanWriteOnly chan <- int

	//生产者消费者模型
	//C： 数组+锁 thread1 : 写， thread2： 读
	//Go: goroutine +channel

	// consumer 消费者 ===> 提供一个只读的通道
	// producer 生产者 ===> 提供一个只写的通道

	//1 在主函数创建一个双向通道
	numChan := make(chan int, 3)

	//2 将numChan传递给producer，负责生产
	go producer(numChan) //双向通道可以赋值给同类型的单向通道，单向不能转双向
	//3 将numChan传递给consumer，负责消费
	go consumer(numChan)

	time.Sleep(2 * time.Second)
}
